sed命令 | 功能 |
---|---|
a\ | 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 |
c\ | 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行 |
i\ | 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行 |
d | 删除行 |
h | 把模式空间里的内容复制到暂存缓冲区 |
H | 把模式空间里的内容追加到暂存缓冲区 |
g | 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 |
G | 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 |
l | 列出非打印字符 |
p | 打印行 |
n | 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 |
r | 从文件中读取输入行 |
! | 对所选行以外的所有行应用命令 |
s | 用一个字符串替换另一个 |
g | 在行内进行全局替换 |
w | 将所选的行写入文件 |
x | 交换暂存缓冲区与模式空间的内容 |
y | 将字符替换为另一字符(不能对正则表达式使用y命令) |
q | 结束或退出sed |
sed选项 | 功能 |
---|---|
e | 进行多项编辑,即对输入行应用多条sed命令时使用 |
-n | 取消默认的输出 |
-f | 指定sed脚本的文件名 |
常用实例
1、匹配范围
#行号范围:打印第3行到第5行
sed -n '3,5p' filename
\#正则表达式匹配范围:从匹配start\_pattern的行开始,到匹配end\_pattern的行结束
sed -n '/start\_pattern/,/end\_pattern/p' filename
\#命令组合:从第1行开始,到第一个空白行为止
sed -n '1,/^\$/p' filename
\#倒数行范围:从第1行开始,直到匹配end\_pattern的行之前(使用!进行取反)
sed -n '1,/end\_pattern/!p' filename
\#指定行的倍数:打印所有奇数行(从第一行开始,步长为 2)
sed -n '1\~2p' filename
2、基础替换
#只替换文本中第一次出现的匹配项,并将结果输出到标准输出
sed 's/foo/bar/' filename
#只替换每行中第三次出现的匹配项
sed 's/foo/bar/3' filename
#只打印替换过的行
sed -n 's/foo/bar/p' filename
#编辑原文件,同时创建 filename.bak 备份
sed -i.bak 's/foo/bar/' filename
#忽略大小写进行替换
sed 's/foo/bar/i' filename
#全局替换
sed 's/foo/bar/g' filename
#全局替换,每行替换从第 2 次开始出现的匹配项
sed 's/foo/bar/2g' filename
3、组合替换
#替换并写入新文件:将替换过的行写入 output.txt
sed 's/foo/bar/w output.txt' filename
#结合标记符:在匹配的字符串后添加后缀
sed 's/foo/&.bak/' filename
#执行sed结果的命令(谨慎使用,可能导致安全风险)
sed 's/systemctl start/systemctl status/e' filename
echo "ls /tmp" | sed 's/ls/ls -l/e'
#行号范围:将第3行到第5行中的"foo"替换为"bar"
sed '3,5s/foo/bar/g' filename
#正则表达式匹配范围:从包含"start"的行开始,到包含"end"的行结束,替换"foo"为"bar"
sed '/start/,/end/s/foo/bar/g' filename
#命令组合:从第1行开始,到第一个空白行为止,替换"foo"为"bar"
sed '1,/^$/s/foo/bar/g' filename
#倒数行范围:从第1行开始,直到包含"end"的行之前,替换"foo"为"bar"
sed '1,/end/!s/foo/bar/g' filename
#指定行的倍数:替换所有奇数行中的"foo"为"bar"
sed '1~2s/foo/bar/g' filename
4、更新操作(a\i\c\)
a,i,c\分别表示在行下追加、行上插入和整行更新,字母符号后面\可以省略
行下追加(a\)
#将 "this is a test line" 追加到含有 "hello" 行的下面
sed -i '/hello/a\this is a test line' filename
#在第 2 行之后插入 "this is a test line"
sed -i '2a\this is a test line' filename
行上插入(i\)
#将 "this is a test line" 插入到含有 "librarookie" 的行上面
sed -i '/librarookie/i\this is a test line' filename
#在第 5 行之前插入 "this is a test line"
sed -i '5i\this is a test line' filename
替换当前行(c\)
#将含有 "librarookie" 的行变成 "this is a test line"
sed -i '/librarookie/c\this is a test line' filename
#将第 5 行变成 "this is a test line"
sed -i '3c\this is a test line' filename
删除操作(d)
#删除全文
sed -i 'd' filename
#删除第 2 行
sed -i '2d' filename
#删除最后一行
sed -i '$d' filename
#删除空白行
sed -i '/^$/d' filename
#以 # 号开头的行(删除注释)
sed -i '/^#/d' filename
#删除文件中所有开头是 test的行
sed -i '/^test/d' filename
#删除文件的第 2 行到 末尾所有行
sed -i '2,$d' filename